package org.x.common.utils;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class SmsCache {

    // 存储手机号与验证码的映射关系
    private static final Map<String, SmsCode> cache = new ConcurrentHashMap<>();

    /**
     * 保存验证码到缓存中
     *
     * @param phone 手机号
     * @param code  验证码
     */
    public static void saveCode(String phone, String code) {
        long expireTime = System.currentTimeMillis() + 5 * 60 * 1000; // 5分钟后过期
        cache.put(phone, new SmsCode(code, expireTime));
    }

    /**
     * 获取验证码
     *
     * @param phone 手机号
     * @return 验证码内容
     */
    public static String getCode(String phone) {
        SmsCode smsCode = cache.get(phone);
        if (smsCode == null || isExpired(smsCode)) {
            return null; // 验证码不存在或已过期
        }
        return smsCode.getCode();
    }

    /**
     * 删除验证码
     *
     * @param phone 手机号
     */
    public static void removeCode(String phone) {
        cache.remove(phone);
    }

    /**
     * 获取上次发送验证码的时间
     *
     * @param phone 手机号
     * @return 上次发送时间（毫秒）
     */
    public static long getLastSentTime(String phone) {
        SmsCode smsCode = cache.get(phone);
        return smsCode != null ? smsCode.getCreateTime() : 0;
    }

    /**
     * 检查验证码是否过期
     *
     * @param smsCode 验证码对象
     * @return 是否过期
     */
    private static boolean isExpired(SmsCode smsCode) {
        return System.currentTimeMillis() > smsCode.getExpireTime();
    }

    /**
     * 内部类：验证码对象
     */
    private static class SmsCode {
        private final String code; // 验证码内容
        private final long expireTime; // 过期时间
        private final long createTime; // 创建时间

        public SmsCode(String code, long expireTime) {
            this.code = code;
            this.expireTime = expireTime;
            this.createTime = System.currentTimeMillis();
        }

        public String getCode() {
            return code;
        }

        public long getExpireTime() {
            return expireTime;
        }

        public long getCreateTime() {
            return createTime;
        }
    }
}
